/**
 * 
 */
package kr.pe.johnkim.dayve.activity;

import java.io.IOException;
import java.util.List;

import kr.pe.johnkim.dayve.provider.DayveLog;
import kr.pe.johnkim.dayve.provider.DayveMember;
import kr.pe.johnkim.dayve.rest.DayveMemberRest;
import kr.pe.johnkim.dayve.rest.DayveCommonRest;
import kr.pe.johnkim.dayve.util.DayveCommon;

import org.json.JSONException;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.view.View.OnClickListener;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;

/**
 * My History 로그인 클래스 이다.
 * 
 * 설정파일에서 id, password 를 가져 와서 비교한 뒤 로그인을 한다.
 * 삭제 후 재설치 시에는 서버에 접속해서 로그인을 한다.
 * 
 * @author johnkim
 *
 */
public class DayveLoginView extends Activity {

	public static String TAG = DayveLoginView.class.getSimpleName();
	
	ProgressBar mDayveProgressbar;
	
	Button btnLogin;		// 로그인 버튼
	Button btnSignup;		// 회원가입 버튼
	
	ImageView imgViewLoginGreen;		// 로그인 버튼. 그린 컬러.
	ImageView imgViewSignupWhite;		// 회원가입 버튼. 화이트 컬러.
	
	CheckBox checkBoxLoginRememberId;
	
	// 설정 파일을 가져 온다.
	private String myPreference = "kr.pe.johnkim.dayve.activity_preferences";
	
	// id
	private String DAYVE_ID = "";
	// password
	private String DAYVE_PASSWORD = "";
	
	EditText edtTxtLoginId;
	EditText edtTxtLoginPassword;
	
	// 로그를 저장한다.
	private static final int THREAD_INSERT_LOG = 100;
	// 서버 로그인을 한다.
	private static final int THREAD_SERVER_LOGIN = 101;
	// 서버 로그인을 실패하면 다이얼로그 창을 띄운다.
	private static final int THREAD_SERVER_LOGIN_FAIL = 102;
	// 서버 로그인 성공 토스트를 띄운다.
	private static final int THREAD_SERVER_LOGIN_SUCCESS = 103;
	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 104;
	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 105;
	
	// 현재 시간.
	private static String currentDate;
	
	DayveCommonRest dayveCommonRest = new DayveCommonRest();
	DayveMemberRest dayveMemberRest = new DayveMemberRest();
	DayveCommon dayveCommon = new DayveCommon();
	
	// server 로그인 결과
	private String RESULT_SERVER_LOGIN = "";
	
	// 자동 로그인 체크박스 선택 상태.
	private String AUTO_LOGIN_STATUS = "";
	
	private String AUTO_LOGIN_STATUS_YN = "";

	/* (non-Javadoc)
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.dayve_login);
		
		// 현재 시간을 가져 온다.
		currentDate = dayveCommon.getCurrentDate();
		
		SharedPreferences mSharedPreferences = getSharedPreferences(myPreference, Activity.MODE_PRIVATE);
		
		// 설정 파일에 저장된 id, password 를 가져 온다.
		DAYVE_ID = mSharedPreferences.getString("dayve_id", "");
		DAYVE_PASSWORD = mSharedPreferences.getString("dayve_password", "");
		AUTO_LOGIN_STATUS = mSharedPreferences.getString("auto_login_status", "");
		AUTO_LOGIN_STATUS_YN = mSharedPreferences.getString("dayve_auto_login_yn", "");
		
		Log.i(TAG, "DAYVE_ID       : " + DAYVE_ID);
		Log.i(TAG, "DAYVE_PASSWORD : " + DAYVE_PASSWORD);
		
		mDayveProgressbar = (ProgressBar)findViewById(R.id.mDayveLoginProgressBar);
		
//		btnLogin = (Button)findViewById(R.id.btnLogin);
//		btnSignup = (Button)findViewById(R.id.btnSignup);
		
		imgViewLoginGreen = (ImageView)findViewById(R.id.imgViewLoginGreen);
		imgViewSignupWhite = (ImageView)findViewById(R.id.imgViewSignupWhite);
		
		edtTxtLoginId = (EditText)findViewById(R.id.edtTxtLoginId);
		edtTxtLoginId.setText(DAYVE_ID);
		edtTxtLoginPassword = (EditText)findViewById(R.id.edtTxtLoginPassword);
		
		checkBoxLoginRememberId = (CheckBox)findViewById(R.id.checkBoxLoginRememberId);
		
		/**
		 * 자동 로그인 옵션이 선택되어 있으면 체크박스에 체크를 세팅 한다.
		 */
		if(("Y").equals(AUTO_LOGIN_STATUS_YN)) {
			checkBoxLoginRememberId.setChecked(true);
		} else {
			checkBoxLoginRememberId.setChecked(false);
		}
		
		/**
		 * 체크박스에 체크가 되어 있으면 자동 로그인으로 세팅 한다.
		 */
		checkBoxLoginRememberId.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // Perform action on clicks
                if (checkBoxLoginRememberId.isChecked()) {
//                	edtTxtLoginId.setText(DAYVE_ID);
                	
                	SharedPreferences mSharedPreferences = getSharedPreferences(myPreference, Activity.MODE_PRIVATE);

        			SharedPreferences.Editor editor = mSharedPreferences.edit();
        			editor.putString("auto_login_status", "Y");
        			
        			editor.commit();
                } else {
//                	edtTxtLoginId.setText("");
                }
            }
        });
		
		/**
		 * 로그인 버튼을 터치한다.
		 * 
		 * 설정 파일의 id, password 값이 있으면 설정 파일의 값과 비교해서 로그인을 하고, 
		 * 만약 없으면 서버에 접속해서 로그인을 한다.
		 * (삭제/설치 후 첫 실행 시.)
		 */
		imgViewLoginGreen.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				
				if(!((("").equals(DAYVE_ID)) && (("").equals(DAYVE_PASSWORD)))) {
					if(((DAYVE_ID).equals(edtTxtLoginId.getText().toString().trim())) && 
							((DAYVE_PASSWORD).equals(edtTxtLoginPassword.getText().toString().trim()))) {
						
						/**
						 * 마일리지 점수를 추가 하고, 
						 * 로그를 저장 한다.
						 */
						Thread thread = new Thread(null, doBackgroundThreadProcessing, "Background_insertLog");
						thread.start();

						showLoginToast();
						
						// 만약 id 저장 옵션이 선택되어 있으면 설정파일을 업데이트 한다.
						SharedPreferences mSharedPreferences = getSharedPreferences(myPreference, Activity.MODE_PRIVATE);
						SharedPreferences.Editor editor = mSharedPreferences.edit();
						
						if(checkBoxLoginRememberId.isChecked()) {
							editor.putString("auto_login_status", "Y");
							editor.putString("dayve_auto_login_yn", "Y");
							
						} else {
							editor.putString("auto_login_status", "");
							editor.putString("dayve_auto_login_yn", "N");
						}
						
						editor.commit();

						Intent dayveSignupView = new Intent(DayveLoginView.this, DayveMainView.class);
						startActivity(dayveSignupView);
//						finish();
					} else {
						new AlertDialog.Builder(DayveLoginView.this)
						.setTitle(getResources().getString(R.string.login_check_login_title))
						.setMessage(getResources().getString(R.string.login_check_login_message))
						.setPositiveButton(getResources().getString(R.string.login_check_login_button), 
							new DialogInterface.OnClickListener() {
								
//								@Override
								public void onClick(DialogInterface dialog, int which) {
									// TODO Auto-generated method stub
								}
							}).show();
					}
				} else {
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_SERVER_LOGIN));
				}
			}
			
		});
		
		// 회원가입 버튼을 터치한다.
		imgViewSignupWhite.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent dayveSignupView = new Intent(DayveLoginView.this, DayveSignupView.class);
				startActivity(dayveSignupView);
//				finish();
			}
			
		});
	}
	
	/**
	 * Handler 를 등록 한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			// 로그를 저장 한다.
			case THREAD_INSERT_LOG : 
				insertLog();
				break;
			// 서버에 로그인을 한다.
			case THREAD_SERVER_LOGIN : 
				threadLogin();
				break;
			// 서버 로그인 실패 타이얼로그 창을 띄운다.
			case THREAD_SERVER_LOGIN_FAIL : 
				showDialogServerLoginFail();
				break;
			// 서버 로그인 성공 토스트를 띄운다.
			case THREAD_SERVER_LOGIN_SUCCESS : 
				showLoginToast();
				break;
			// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
				mDayveProgressbar.setVisibility(View.VISIBLE);
				break;
			// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				mDayveProgressbar.setVisibility(View.INVISIBLE);
				break;
			}
		}
	};
	
	/**
	 * server 로그인을 한다.
	 * 
	 * 실제 체크는 login 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadLogin() {
		Log.i(TAG, "threadLogin");
		
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				login();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * server 로그인을 한다.
	 */
	private void login() {
		Log.i(TAG, "login");
		
		DayveMember parameterMember = new DayveMember();
		
		parameterMember.setId(edtTxtLoginId.getText().toString().trim());
		parameterMember.setPassword(edtTxtLoginPassword.getText().toString().trim());
		
		Log.i(TAG, "id       : " + parameterMember.getId());
		Log.i(TAG, "password : " + parameterMember.getPassword());
		
		try {
			RESULT_SERVER_LOGIN = dayveMemberRest.login(parameterMember).getCount();
			
			Log.i(TAG, "RESULT_SERVER_LOGIN : " + RESULT_SERVER_LOGIN);
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
		/**
		 * server 로그인 결과에 따라 창을 띄운다.
		 * 
		 * 로그인에 성공하면 toast 를 띄운 뒤 main 페이지로 이동하고, 
		 * 실패하면 다이얼로그 창을 출력한 뒤 다시 로그인을 시도 한다.
		 */
		if(("1").equals(RESULT_SERVER_LOGIN)) {
			// server 로그인 성공.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_SERVER_LOGIN_SUCCESS));
			
			// 설정 파일에 id 와 password 를 저장 한다.
			SharedPreferences mSharedPreferences = getSharedPreferences(myPreference, Activity.MODE_PRIVATE);

			SharedPreferences.Editor editor = mSharedPreferences.edit();
			editor.putString("dayve_id", edtTxtLoginId.getText().toString());
			editor.putString("dayve_password", edtTxtLoginPassword.getText().toString());
			if(checkBoxLoginRememberId.isChecked()) {
				editor.putString("auto_login_status", "Y");
			}
			editor.commit();

			DAYVE_ID = mSharedPreferences.getString("dayve_id", "");
			DAYVE_PASSWORD = mSharedPreferences.getString("dayve_password", "");
			
			/**
			 * 마일리지 점수를 추가 하고, 
			 * 로그를 저장 한다.
			 */
			Thread thread = new Thread(null, doBackgroundThreadProcessing, "Background_insertLog");
			thread.start();
			
			// main 화면으로 이동 한다.
			Intent dayveMainView = new Intent(DayveLoginView.this, DayveMainView.class);
			startActivity(dayveMainView);
			finish();
		} else if(("0").equals(RESULT_SERVER_LOGIN)) {
			// server 로그인 실패.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_SERVER_LOGIN_FAIL));
		} else if(("null").equals(RESULT_SERVER_LOGIN)) {
			// 통신장애로 인한 로그인 실패.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_SERVER_LOGIN_FAIL));
		} else if(("ERROR").equals(RESULT_SERVER_LOGIN)) {
			// 실행 오류로 인한 로그인 실패.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_SERVER_LOGIN_FAIL));
		}
	}
	
	/**
	 * server 로그인 실패 다이얼로그 창을 띄운다.
	 */
	private void showDialogServerLoginFail() {
		Log.e(TAG, "showDialogFailIdCheckDuplication");
		
		new AlertDialog.Builder(DayveLoginView.this)
		.setTitle(getResources().getString(R.string.login_fail_login_title))
		.setMessage(getResources().getString(
				R.string.login_fail_login_message_01) + 
				"\n" + 
				getResources().getString(R.string.login_fail_login_message_02)
				)
		.setPositiveButton(getResources().getString(R.string.login_fail_login_button), 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * Toast 를 띄운다.
	 */
	private void showLoginToast() {
		CharSequence text = getResources().getString(R.string.login_success_login);
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * 로그를 저장 한다.
	 */
	private void insertLog() {
		Log.i(TAG, "insertLog");
		
		DayveLog dayveLog = new DayveLog();
		
		dayveLog.setId(DAYVE_ID);
		dayveLog.setViewName(TAG);
		dayveLog.setAccessDate(currentDate);
		
		try {
			dayveCommonRest.registerLog(dayveLog);
			Log.i(TAG, "Success to insert log.");
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		}
	}
	
	/**
	 * 사용자의 마일리지 점수를 가져 와서 1 증가한 뒤 업데이트 한다.
	 */
	private void checkMileage() {
		Log.i(TAG, "checkMileage");
		
		DayveMember dayveMember = new DayveMember();
		
		int intOldMileage = 0;
		
		dayveMember.setId(DAYVE_ID);
		dayveMember.setModifyDate(currentDate);
		
		try {
			intOldMileage = Integer.parseInt(dayveMemberRest.selectMileage(dayveMember).getMileage());
			
			intOldMileage++;
			
			dayveMember.setMileage("" + intOldMileage);
			
			if(("SUCCESS").equals(dayveMemberRest.updateMileage(dayveMember))) {
				Log.i(TAG, "Success to update mileage.");
			} else {
				Log.i(TAG, "Fail to update mileage.");
			}
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 로그 저장은 UI 와 관계 없기 때문에 background thread 로 구현 함 : child thread
	 * 
	 * 사용자의 마일리지 점수를 추가 하고 로그를 저장 한다.
	 */
	private Runnable doBackgroundThreadProcessing = new Runnable() {
		
		public void run() {
			// TODO Auto-generated method stub
			checkMileage();
			insertLog();
		}
	};

	/**
	 * 화면을 닫기 전에 로그를 저장 한다.
	 */
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		
		// 로그를 저장 한다.
//		mHandler.sendMessage(mHandler.obtainMessage(THREAD_INSERT_LOG));
		
		// main thread 에서 child thread 를 호출 한다.
//		Thread thread = new Thread(null, doBackgroundThreadProcessing, "Background_insertLog");
//		thread.start();
		
		finish();
	}
	
	/* 최상위 프로세스가 아닐 경우 프로세스를 종료 한다.
	 * 
	 * => Home Key 를 눌렀을때 프로세스를 종료 한다.
	 * 
	 * @see android.app.Activity#onPause()
	 */
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		
		if(!isForegrdound()) {
//			System.exit(0);
		}
	}
	
	/**
	 * 현재 프로세스가 최상위로 실행중인지 검사 한다.
	 * 
	 * true : 최상위
	 * 
	 * @return
	 */
	public boolean isForegrdound() {
	    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
	    List<RunningTaskInfo> list = am.getRunningTasks(1);
	    ComponentName cn = list.get(0).topActivity;
	    String name = cn.getPackageName();
	     
	    return name.indexOf(getPackageName()) > -1;
	}
}
